home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / SNIP0492.ARJ / CAL.C < prev    next >
C/C++ Source or Header  |  1991-10-02  |  3KB  |  109 lines

  1. /*
  2. **  CAL - a calendar for DOS
  3. **
  4. **  a public domain demo using Ray Gardner's SCALDATE.C scalar date functions
  5. **  by Bob Stout
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. /*
  12. **  function prototypes for SCALDATE.C
  13. */
  14.  
  15. int isleap (unsigned);
  16. long ymd_to_scalar (unsigned, unsigned, unsigned);
  17.  
  18. /*
  19. **  calendar generation information
  20. */
  21.  
  22. int days[12]    = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  23. char *month[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
  24.                    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
  25.  
  26. /*
  27. **  box drawing stuff
  28. */
  29.  
  30. #ifdef MSDOS
  31.  const char *topborder = "\xd5\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  32.                          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  33.                          "\xcd\xcd\xcd\xcd\xb8";
  34.  const char *botborder = "\xd4\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  35.                          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  36.                          "\xcd\xcd\xcd\xcd\xbe";
  37.  const char *line = "\xb3";
  38. #else
  39.  const char *line = "";
  40. #endif
  41.  
  42. /*
  43. **  tell 'em they messed up
  44. */
  45.  
  46. void usage(void)
  47. {
  48.       puts("Usage: CAL m y");
  49.       puts("where: m = month (1 - 12)");
  50.       puts("       y = year (1 - 99, 1800 - 3000)");
  51.       exit(-1);
  52. }
  53.  
  54. /*
  55. **  here's where the real work's done
  56. */
  57.  
  58. int main(int argc, char *argv[])
  59. {
  60.       int day, day_1, numdays;
  61.       unsigned yr, mo;
  62.  
  63.       if (3 > argc)
  64.             usage();
  65.  
  66.       yr = atoi(argv[2]);
  67.       mo = atoi(argv[1]);
  68.  
  69.       if (!mo || 12 < mo)
  70.             usage();
  71.  
  72.       if (100 > yr)
  73.             yr += 1900;
  74.  
  75.       if (3000 < yr || 1800 > yr)
  76.             usage();
  77.  
  78.       numdays = days[mo - 1];
  79.       if (2 == mo && isleap(yr))
  80.             ++numdays;
  81.       day_1 = (int)(ymd_to_scalar(yr, mo, 1) % 7L);
  82.  
  83.       printf("\n%s, %d\n", month[mo - 1], yr);
  84. #ifdef MSDOS
  85.       puts(topborder);
  86. #endif
  87.       printf("%sSun Mon Tue Wed Thu Fri Sat%s\n", line, line);
  88.       printf("%s---------------------------%s\n%s", line, line, line);
  89.  
  90.       for (day = 0; day < day_1; ++day)
  91.             fputs("    ", stdout);
  92.       for (day = 1; day <= numdays; ++day, ++day_1, day_1 %= 7)
  93.       {
  94.             if (!day_1 && 1 != day)
  95.                   printf("\b%s\n%s", line, line);
  96.             printf("%3d ", day);
  97.       }
  98.       for ( ; day_1; ++day_1, day_1 %= 7)
  99.             fputs("    ", stdout);
  100. #ifdef MSDOS
  101.       printf("\b%s\n", line);
  102.       puts(botborder);
  103. #else
  104.       fputc('\n', stdout);
  105. #endif
  106.  
  107.       return 0;
  108. }
  109.